//
//  ADSHelper.swift
//  TaxBillAssistant
//
//  Created by Huimin Li on 2025/3/6.
//

import AdServices

class WsHcpADSHelper{
    
    
    class func getAppleAttribution(completion: @escaping ([String: Any]?) -> Void) {
        if #available(iOS 14.3, *) {
            var token: String? = nil
            do {
                // 1. 尝试获取 AAAttribution Token
                token = try AAAttribution.attributionToken()
            } catch {
                print("LogAds：获取 AAAttribution Token 失败: \(error)")
            }
            
            print("LogAds：AdServices Token: \(token ?? "无")")
            
            if let token = token {
                //保存获取的token
                UserDefaults.standard.set(token, forKey: "token")
                // 2. 调用你现有的 sendToken 方法，传入 token，它应该异步返回 attrData
                sendToken(getANullableString("token", content: token)) { attrData in
                    print("LogAds：获取到的归因数据 attrData: \(attrData ?? [:])")
                    
                    // 3. 直接通过闭包把 attrData 返回给调用者
                    completion(attrData)
                }
            } else {
                print("LogAds：未获取到 AAAttribution Token，无法请求归因数据")
                // 没有 token，返回 nil
                completion(nil)
            }
        } else {
            print("LogAds：设备系统版本低于 iOS 14.3，不支持 AAAttribution")
            // 系统版本太低，返回 nil
            completion(nil)
        }
    }
    
    /// 读取可能为空的字符串
        class func getANullableString(_ desc: String?, content: String?) -> String? {
            if content == nil {
                return ""
            }
            return "\(content ?? "")"
        }
    
        /// 发送归因token得到数据
    class func sendToken(_ token: String?, completeBlock: @escaping (_ data: [String : Any]?) -> Void) {
        // 初始调用，尝试次数为1
        sendTokenWithRetry(token, attempt: 1, maxRetries: 4, completeBlock: completeBlock)
    }

    /// 带重试机制的私有请求方法
    private class func sendTokenWithRetry(_ token: String?,
                                         attempt: Int,
                                         maxRetries: Int,
                                         completeBlock: @escaping ([String : Any]?) -> Void) {
        let url = "https://api-adservices.apple.com/api/v1/"
        guard let url1 = URL(string: url) else {
            // URL无效，直接返回空结果
            completeBlock([:])
            return
        }
        
        var request = URLRequest(url: url1)
        request.httpMethod = "POST"
        request.addValue("text/plain", forHTTPHeaderField: "Content-Type")
        let postData = token?.data(using: .utf8)
        request.httpBody = postData
        
        // 发起网络请求
        URLSession.shared.dataTask(with: request) { data, response, error in
            if let error = error {
                print("=====flutter:LogAds：sendToken请求失败（第\(attempt)次），错误：\(error.localizedDescription)")
                
                // 判断是否需要重试（未达到最大次数且错误非nil）
                if attempt < maxRetries {
                    let retryDelay = 2.0 // 重试间隔1秒
                    print("flutter:LogAds：将在\(retryDelay)秒后重试...")
                    
                    // 延迟执行下一次重试
                    DispatchQueue.global().asyncAfter(deadline: .now() + retryDelay) {
                        sendTokenWithRetry(token, attempt: attempt + 1, maxRetries: maxRetries, completeBlock: completeBlock)
                    }
                    return
                } else {
                    // 达到最大重试次数，返回空字典
                    print("flutter:LogAds：已达到最大重试次数（\(maxRetries)次），停止重试")
                    completeBlock([:])
                    return
                }
            }
            
            // 请求成功，解析响应数据
            var result: [String : Any]? = nil
            if let data = data {
                do {
                    result = try JSONSerialization.jsonObject(with: data, options: []) as? [String : Any]
                } catch {
                    print("flutter:LogAds：JSON解析失败，错误：\(error.localizedDescription)")
                    result = [:] // 解析失败返回空字典
                }
            } else {
                result = [:] // 无数据返回空字典
            }
            
            completeBlock(result)
        }.resume()
    }
       
        struct Platform {
            static let isSimulator: Bool = {
                var isSim = false
                #if arch(i386) || arch(x86_64)
                    isSim = true
                #endif
                return isSim
            }()
        }
    
}
